package com.baizhi.wxt.service;

import com.baizhi.wxt.dao.AdminDao;
import com.baizhi.wxt.entity.Admin;
import com.baizhi.wxt.utils.ImageCodeUtil;
import com.baizhi.wxt.utils.Md5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
@Transactional
public class AdminServiceImpl implements AdminService{
    @Autowired
    private AdminDao adminDao;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void registerAdmin(Admin admin) {
        String password = admin.getPassword();

        //调用工具类 获取随机盐
        String salt = Md5Utils.getSalt(6);
        //对原始密码 加随机盐
        String saltPwd = salt + password + salt;

        //调用工具类 对加随机盐后的密码 进行md5加密
        String md5Code = Md5Utils.getMd5Code(saltPwd);

        //对传递过来的管理员数据进行数据加工
        admin.setPassword(md5Code);
        admin.setSalt(salt);

        //调用添加方法
        adminDao.insterAdmin(admin);
    }

    @Override
    public Map<String,String> getImageCodes() {
        Map<String, String> map = new HashMap<String, String>();
        try {

            //调用工具类 获取随机验证码字符
            String code = ImageCodeUtil.getSecurityCode();
            //调用工具类 根据随机码 生成图片 base64 形式
            String imgBase64 = ImageCodeUtil.careateImgBase64(code);

            //把base64 图片信息 存入map
            map.put("imgCode",imgBase64);

            //获取UUID
            String uuid = UUID.randomUUID().toString();
            //把uuid存入map
            map.put("token",uuid);

            //王redis中村验证码
            //序列化
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            ValueOperations valueOperations = redisTemplate.opsForValue();
            valueOperations.set("CODE_"+uuid,code,1, TimeUnit.MINUTES);

        }catch (Exception e){
            e.printStackTrace();
        }
        return map;
    }
    @Override
    public Map<String,String> login(Admin admin,String token){
        Map<String,String> map = new HashMap<String,String>();
        //从redis中获取验证码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object obj = valueOperations.get("CODE_" + token);

        //检查验证码
        if(obj==null){
            map.put("message","验证码过期");
            map.put("state","error");
            return map;
        }

        String serverCode = obj.toString();
        if(!admin.getEnCode().equals(serverCode)){
            map.put("message","验证码错误");
            map.put("state","error");
            return map;
        }
        //验证码正确 检查账号密码
        Admin admin1 = adminDao.selectByName(admin.getUsername());
        if(admin1==null){
            map.put("message","用户不存在");
            map.put("state","error");
            return map;
        }else{ //账号存在
            if(admin.getStatus()=="0"){
                map.put("message","用户已冻结！！");
                map.put("state","error");
                return map;
            }

            //获取输入的密码
            String password = admin.getPassword();
            //加相同的盐
            String pwd = admin1.getSalt() + password +admin1.getSalt();
            //对加盐后的密码 进行md5加密
            String md5Code = Md5Utils.getMd5Code(pwd);
            if(md5Code.equals(admin1.getPassword())){
                map.put("state","success");
                map.put("message",token);
                valueOperations.set("TOKEN_"+token,admin1);
            }else {
                map.put("message","密码错误");
                map.put("state","error");
                return map;
            }
        }

        return map;
    }

    @Override
    public Admin getUserInfo(String token){
        //从redis中获取登录信息
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Admin admin = (Admin) valueOperations.get("TOKEN_" + token);
        return admin;
    }

    @Override
    //退出
    public void logout(String token) {

        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.delete("TOKEN_" + token);

    }


}
